Eesti

Avastage GraphQL Föderatsiooni võimsus skeemi sidumise (Schema Stitching) abil. Õppige, kuidas luua ühtne GraphQL API mitmest teenusest, parandades skaleeritavust ja hooldatavust.

GraphQL Föderatsioon: Skeemi sidumine (Schema Stitching) - põhjalik juhend

Kaasaegse rakenduste arenduse pidevalt areneval maastikul on skaleeritavate ja hooldatavate arhitektuuride vajadus muutunud esmatähtsaks. Mikroteenused on oma olemusliku modulaarsuse ja iseseisva kasutuselevõtuga kujunenud populaarseks lahenduseks. Paljude mikroteenuste haldamine võib aga tekitada keerukusi, eriti kui on vaja pakkuda kliendirakendustele ühtset API-d. Siin tulebki mängu GraphQL Föderatsioon ja eriti skeemi sidumine (Schema Stitching).

Mis on GraphQL Föderatsioon?

GraphQL Föderatsioon on võimas arhitektuur, mis võimaldab teil luua ühe, ühtse GraphQL API mitmest aluseks olevast GraphQL teenusest (mis sageli esindavad mikroteenuseid). See võimaldab arendajatel pärida andmeid erinevatest teenustest, justkui oleks tegemist ühe graafikuga, lihtsustades kliendi kogemust ja vähendades vajadust keeruka orkestreerimisloogika järele kliendi poolel.

GraphQL Föderatsioonile on kaks peamist lähenemist:

See artikkel keskendub skeemi sidumisele (Schema Stitching), uurides selle kontseptsioone, eeliseid, piiranguid ja praktilist rakendamist.

Skeemi sidumise mõistmine

Skeemi sidumine on mitme GraphQL skeemi liitmise protsess üheks, sidusaks skeemiks. See ühtne skeem toimib fassaadina, varjates aluseks olevate teenuste keerukuse kliendi eest. Kui klient teeb päringu seotud skeemile, suunab lüüs päringu arukalt vastavasse alusteenusesse (või teenustesse), hangib andmed ja kombineerib tulemused enne nende kliendile tagastamist.

Mõelge sellest nii: teil on mitu restorani (teenused), mis on spetsialiseerunud erinevatele köökidele. Skeemi sidumine on nagu universaalne menüü, mis koondab kõigi restoranide kõik road. Kui klient (klient) tellib universaalsest menüüst, suunatakse tellimus arukalt vastavatesse restoraniköökidesse, toit valmistatakse ja kombineeritakse seejärel üheks tarnimiseks kliendile.

Skeemi sidumise põhimõisted

Skeemi sidumise eelised

Skeemi sidumine pakub mitmeid kaalukaid eeliseid organisatsioonidele, kes võtavad kasutusele mikroteenuste arhitektuuri:

Skeemi sidumise piirangud

Kuigi skeemi sidumine pakub arvukalt eeliseid, on oluline olla teadlik ka selle piirangutest:

Skeemi sidumise praktiline rakendamine

Vaatame läbi lihtsustatud näite, kuidas rakendada skeemi sidumist Node.js-i ja graphql-tools teegi (populaarne valik skeemi sidumiseks) abil. See näide hõlmab kahte mikroteenust: kasutajateenus (User Service) ja tooteteenus (Product Service).

1. Kaug-skeemide määratlemine

Kõigepealt määratlege GraphQL skeemid iga kaugteenuse jaoks.

Kasutajateenus (user-service.js):


const { buildSchema } = require('graphql');

const userSchema = buildSchema(`
  type User {
    id: ID!
    name: String
    email: String
  }

  type Query {
    user(id: ID!): User
  }
`);

const users = [
  { id: '1', name: 'Alice Smith', email: 'alice@example.com' },
  { id: '2', name: 'Bob Johnson', email: 'bob@example.com' },
];

const userRoot = {
  user: (args) => users.find(user => user.id === args.id),
};

module.exports = {
  schema: userSchema,
  rootValue: userRoot,
};

Tooteteenus (product-service.js):


const { buildSchema } = require('graphql');

const productSchema = buildSchema(`
  type Product {
    id: ID!
    name: String
    price: Float
    userId: ID!  # Võõrvõti kasutajateenusele
  }

  type Query {
    product(id: ID!): Product
  }
`);

const products = [
  { id: '101', name: 'Laptop', price: 1200, userId: '1' },
  { id: '102', name: 'Smartphone', price: 800, userId: '2' },
];

const productRoot = {
  product: (args) => products.find(product => product.id === args.id),
};

module.exports = {
  schema: productSchema,
  rootValue: productRoot,
};

2. Lüüsiteenuse loomine

Nüüd looge lüüsiteenus, mis seob kaks skeemi omavahel kokku.

Lüüsiteenus (gateway.js):


const { stitchSchemas } = require('@graphql-tools/stitch');
const { makeRemoteExecutableSchema } = require('@graphql-tools/wrap');
const { graphqlHTTP } = require('express-graphql');
const express = require('express');
const { introspectSchema } = require('@graphql-tools/wrap');
const { printSchema } = require('graphql');
const fetch = require('node-fetch');

async function createRemoteSchema(uri) {
  const fetcher = async (params) => {
    const response = await fetch(uri, {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(params),
    });
    return response.json();
  };

  const schema = await introspectSchema(fetcher);
  return makeRemoteExecutableSchema({
    schema,
    fetcher,
  });
}

async function main() {
  const userSchema = await createRemoteSchema('http://localhost:4001/graphql');
  const productSchema = await createRemoteSchema('http://localhost:4002/graphql');

  const stitchedSchema = stitchSchemas({
    subschemas: [
      { schema: userSchema },
      { schema: productSchema },
    ],
    typeDefs: `
      extend type Product {
        user: User
      }
    `,
    resolvers: {
      Product: {
        user: {
          selectionSet: `{ userId }`,
          resolve(product, args, context, info) {
            return info.mergeInfo.delegateToSchema({
              schema: userSchema,
              operation: 'query',
              fieldName: 'user',
              args: {
                id: product.userId,
              },
              context,
              info,
            });
          },
        },
      },
    },
  });

  const app = express();
  app.use('/graphql', graphqlHTTP({
    schema: stitchedSchema,
    graphiql: true,
  }));

  app.listen(4000, () => console.log('Lüüsiserver töötab aadressil http://localhost:4000/graphql'));
}

main().catch(console.error);

3. Teenuste käivitamine

Peate käivitama kasutajateenuse ja tooteteenuse erinevatel portidel. Näiteks:

Kasutajateenus (port 4001):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./user-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4001, () => console.log('Kasutajateenus töötab aadressil http://localhost:4001/graphql'));

Tooteteenus (port 4002):


const express = require('express');
const { graphqlHTTP } = require('express-graphql');
const { schema, rootValue } = require('./product-service');

const app = express();
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: rootValue,
  graphiql: true,
}));

app.listen(4002, () => console.log('Tooteteenus töötab aadressil http://localhost:4002/graphql'));

4. Seotud skeemi pärimine

Nüüd saate pärida seotud skeemi lüüsi kaudu (mis töötab pordil 4000). Saate käivitada sellise päringu:


query {
  product(id: "101") {
    id
    name
    price
    user {
      id
      name
      email
    }
  }
}

See päring hangib toote ID-ga "101" ja toob ka seotud kasutaja kasutajateenusest, demonstreerides, kuidas skeemi sidumine võimaldab teil pärida andmeid mitmest teenusest ühe päringuga.

Täiustatud skeemi sidumise tehnikad

Lisaks põhinäitele on siin mõned täiustatud tehnikad, mida saab kasutada oma skeemi sidumise rakenduse täiustamiseks:

Valik skeemi sidumise ja Apollo Föderatsiooni vahel

Kuigi skeemi sidumine on GraphQL Föderatsiooni jaoks elujõuline valik, on Apollo Föderatsioon muutunud populaarsemaks tänu oma täiustatud funktsioonidele ja paremale arendajakogemusele. Siin on kahe lähenemise võrdlus:

Omadus Skeemi sidumine Apollo Föderatsioon
Skeemi määratlus Kasutab olemasolevat GraphQL skeemikeelt Kasutab deklaratiivset skeemikeelt koos direktiividega
Päringu planeerimine Nõuab käsitsi päringu delegeerimist Automaatne päringu planeerimine Apollo lüüsi poolt
Tüübilaiendused Piiratud tugi Sisseehitatud tugi tüübilaiendustele
Võtmedirektiivid Ei toetata Kasutab @key direktiivi olemite tuvastamiseks
Hajutatud jälgimine Nõuab käsitsi rakendamist Sisseehitatud tugi hajutatud jälgimisele
Tööriistad ja ökosüsteem Vähem küpsed tööriistad Küpsamad tööriistad ja suur kogukond
Keerukus Võib suurtes süsteemides olla keeruline hallata Loodud suurte ja keerukate süsteemide jaoks

Millal valida skeemi sidumine:

Millal valida Apollo Föderatsioon:

Reaalse maailma näited ja kasutusjuhud

Siin on mõned reaalse maailma näited, kuidas GraphQL Föderatsiooni, sealhulgas skeemi sidumist, saab kasutada:

Skeemi sidumise parimad tavad

Skeemi sidumise eduka rakendamise tagamiseks järgige neid parimaid tavasid:

Kokkuvõte

GraphQL Föderatsioon koos skeemi sidumisega pakub võimsat lähenemist ühtsete API-de loomiseks mitmest teenusest mikroteenuste arhitektuuris. Mõistes selle põhikontseptsioone, eeliseid, piiranguid ja rakendustehnikaid, saate kasutada skeemi sidumist andmetele juurdepääsu lihtsustamiseks, skaleeritavuse parandamiseks ja hooldatavuse suurendamiseks. Kuigi Apollo Föderatsioon on kujunenud arenenumaks lahenduseks, jääb skeemi sidumine elujõuliseks valikuks lihtsamate stsenaariumide korral või olemasolevate GraphQL teenuste integreerimisel. Kaaluge hoolikalt oma konkreetseid vajadusi ja nõudeid, et valida oma organisatsiooni jaoks parim lähenemine.